package c.x.jy.bean.event;

import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import lombok.extern.slf4j.Slf4j;
@Slf4j
@Aspect
@Component
public class EventAspect {

 

    @Pointcut("@annotation(org.springframework.context.event.EventListener)")
    public void annotationPoint(){};

    /**
     * 对横切方法，进行反射处理，对使用了注解方法“前”：不仅可以捕捉到注解内容，还有方法名等，
     * 此处的作用主要是：可以对使用注解使用的方法，进行方法特殊逻辑处理（可以具体到哪个方法使用了哪个注解内容进行特殊处理）
     *
     */
    @Before("annotationPoint()")   
    public void BeforeAnnotation(JoinPoint joinPoint){
        MethodSignature signature=(MethodSignature) joinPoint.getSignature();
        Method method=signature.getMethod();
        Parameter[] parameters = method.getParameters();
        System.out.println("获取参数名称："+parameters[0].getName());
        //Todo 这里主要是考虑到后期进行事务性事件的触发等待用的，事件触发后在这里等待事件完成后进行处理
    }

    /**
     * 对横切方法，进行反射处理，对使用了注解方法“后”：不仅可以捕捉到注解内容，还有方法名等，
     * 此处的作用主要是：可以对使用注解使用的方法，进行方法特殊逻辑处理（可以具体到哪个方法使用了哪个注解内容进行特殊处理）
     *
     */
    @After("annotationPoint()")
    public void AfterAnnotation(JoinPoint joinPoint){
        MethodSignature signature=(MethodSignature) joinPoint.getSignature();
        Method method=signature.getMethod();

    }

    @Around("annotationPoint()")
    public void AroundAnnotation(ProceedingJoinPoint proceedingJoinPoint){
        try{
            proceedingJoinPoint.proceed();
        }catch (Throwable e){
            log.error(proceedingJoinPoint.getSignature().getName()
                    + " ------------- eventLister 方法执行发生了异常!!! -------------： " , e);
        }
    }

    @AfterThrowing(value = "annotationPoint()",throwing = "ex")
    public void AfterThrowing(JoinPoint joinPoint,Throwable ex){
        log.error(joinPoint.getSignature().getName()
                + " ++++++*****++++ eventLister method exception happens!!!  ++++++*****++++： " , ex);
    }
}
